這次的文章主要是參考張元的影片來做筆記,接下來要介紹關於ELF與ASM的部分
.bss
: 存放未初始化值的全域變數 (global variable).data
: 存放具初始化值的全域變數.rodata
: 存放唯讀(read only)資料.text
: 存放編譯後的code
RSP
- Stack Pointer Registers
RBP
- Base Pointer Registers
RIP
- Register Instruction Pointer
jmp
- 跳至程式某一個地址A(address)執行
call
- 將call完後回來緊接著要執行下一行指令位置push到stack上儲存起來,在跳過去執行
leave
- 還原至caller的stack frame
ret(return)
compiler前面三行通常都為:
func:
push rbp ; 把saved rbp疊上去stack
mov rbp, rsp
sub rsp, 0x70 ;把stack往前減一個空間(0x70), 目的是預留local variable 需要用到的空間
Pass parameters
x64
- register 傳參x86
- stack 傳參https://github.com/yuawn/NTU-Computer-Security
版主您好!感謝您用心整理這篇關於 ELF 和 x64 Assembly 的詳細筆記。您對於 ELF 各個 section 的說明非常清楚,特別是 call
、leave
和 ret
等指令在 stack 上的操作解析,讓我對執行檔的內部運作和函數呼叫流程有了更深刻的理解。
看到您提到了 push rbp; mov rbp, rsp; sub rsp, 0x70
這段常見的函數開頭,這對於理解 stack frame 的建立真的很關鍵。能夠將這些底層概念用筆記形式分享出來,真的很棒!期待您未來分享更多相關技術文章。
也歡迎版主有空參考我的系列文「南桃AI重生記」:
https://ithelp.ithome.com.tw/users/20046160/ironman/8311